/**
 * 
 */
package graphique;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

import piece.Piece;
import piece.PieceType;
import piece.Pion;
import core.Coordonnees;
import core.Couleur;
import core.DeplacementException;
import core.JeuJoueurException;
import echiquier.Echiquier;
import echiquier.EtatRoi;

/**
 * @author baptiste.andrini
 *
 */
public class Fenetre_Echiquier extends JFrame implements MouseListener, MouseMotionListener {

	private static final long serialVersionUID = 1L;

	JLayeredPane layeredPane;
	JPanel chessBoard;
	JLabelPiece chessPiece;
	int xAdjustment;
	int yAdjustment;
	int nbrLigne = 8;
	int nbrCol = 8;
	Echiquier echiquier;
	Point parentLocation;
	JMenu menuDernierCoup;

	public Fenetre_Echiquier(){

		Dimension boardSize = new Dimension(800, 800);

		JTextField textf = new JTextField();
		textf.setColumns(10);

		layeredPane = new JLayeredPane();
		getContentPane().add(layeredPane);
		layeredPane.setPreferredSize(boardSize);

		chessBoard = new JPanel();
		layeredPane.add(chessBoard,JLayeredPane.DEFAULT_LAYER);
		chessBoard.setLayout(new GridLayout(8,8));
		chessBoard.setPreferredSize(boardSize);
		chessBoard.setBounds(0,0,boardSize.width,boardSize.height);

		JMenuBar menuBar = new JMenuBar();

		JMenu menu1 = new JMenu("Partie");
		menuBar.add(menu1);
		

		JMenuItem item1 = new JMenuItem("Nouvelle Partie Locale");
		item1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if(echiquier != null){
					return;
				}
				creationEchiquier();
			}
		});
		menu1.add(item1);
		
		JMenuItem item2 = new JMenuItem("Nouvelle Partie Multijoueur");
		item2.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				System.out.println("creation nouvelle partie.");
			}
		});
		menu1.add(item2);
		
		setJMenuBar(menuBar);

	}

	/**
	 * Cette méthode crée l'échiquier et le génère en IHM. Ajoute également les listeners sur la JFrame
	 */
	private void creationEchiquier(){
		echiquier = null;
		echiquier = new Echiquier();
		
		layeredPane.addMouseListener(this);
		layeredPane.addMouseMotionListener(this);

		File f=new File("");
		String rp = f.getAbsolutePath()+"/src/graphique/icon_piece";

		for(Component c: chessBoard.getComponents()){
			chessBoard.remove(c);
		}
		
		for(int y=8 ; y>=1 ; y--){
			for(int x=1 ; x<=8 ; x++){
				JPanelCase square = new JPanelCase(new BorderLayout());
				square.setCoos(new Coordonnees(x, y));
				square.setCase(echiquier.getPlateau().get(new Coordonnees(x, y)));
				
				chessBoard.add(square);
				if( (x+y)%2 == 1){
					square.setBackground(Color.white);
				}else{
					square.setBackground(Color.black);
				}

				Piece pc = square.getCase().getPiece();
				if(pc != null){
					rp = f.getAbsolutePath()+"/src/graphique/icon_piece";
					rp = rp+"/"+pc.getCouleur().toString()+"/"+pc.getType().toString()+".png";
					JLabelPiece pl = new JLabelPiece(new ImageIcon(rp),pc);
					square.add(pl);
				}
			}
		}
		chessBoard.setVisible(false);
		chessBoard.repaint();
		chessBoard.setVisible(true);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame frame = new Fenetre_Echiquier();
		frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE );
		frame.pack();
		frame.setResizable(false);
		frame.setLocationRelativeTo( null );
		frame.setVisible(true);
	}

	@Override
	public void mouseDragged(MouseEvent arg0) {
		if(chessPiece==null){
			return;
		}
		chessPiece.setLocation(arg0.getX() + xAdjustment, arg0.getY() + yAdjustment);
	}

	@Override
	public void mouseMoved(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		chessPiece = null;
		Component c =  chessBoard.findComponentAt(arg0.getX(), arg0.getY());

		if(c instanceof JPanelCase){
			System.out.println(((JPanelCase) c).getCoos());
			System.out.println(((JPanelCase) c).getCase().getPiece());
			return;//Si on a cliqué sur une pièce on arrète là.
		}

		parentLocation = c.getParent().getLocation();
		xAdjustment = parentLocation.x - arg0.getX();
		yAdjustment = parentLocation.y - arg0.getY();
		chessPiece = (JLabelPiece)c;

		if(chessPiece.getPiece().getCouleur() != echiquier.getJoueurCourant()){
			chessPiece = null;
			return;
		}

		chessPiece.setLocation(arg0.getX() + xAdjustment, arg0.getY() + yAdjustment);
		chessPiece.setSize(chessPiece.getWidth(), chessPiece.getHeight());
		layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		if(chessPiece != null){
			chessPiece.setVisible(false);
			JPanelCase jpc = (JPanelCase) chessBoard.findComponentAt(parentLocation);
			jpc.add(chessPiece);
			chessPiece.setVisible(true);
			chessPiece = null;
		}
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {

	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		if(chessPiece == null){
			return;
		}

		chessPiece.setVisible(false);
		Component c = chessBoard.findComponentAt(arg0.getX(),arg0.getY());

		if(c instanceof JLabel){
			Container parent = c.getParent();
			JPanelCase jpc = (JPanelCase) parent;
			try {
				echiquier.deplace(chessPiece.getPiece(), jpc.getCase());
				parent.remove(0);
				parent.add(chessPiece);
				promotion(chessPiece);
				chessPiece.setVisible(true);
				chessPiece = null;
			} catch (DeplacementException e) {
				retourArriere();
				System.out.println("Le déplacement n'est pas valide.");
			} catch (JeuJoueurException e) {
				retourArriere();
				e.printStackTrace();
			}
		}else{
			Container parent = (Container)c;
			JPanelCase jpc = (JPanelCase) parent;
			try {
				echiquier.deplace(chessPiece.getPiece(), jpc.getCase());
				parent.add(chessPiece);
				promotion(chessPiece);
				chessPiece.setVisible(true);
				chessPiece = null;
			} catch (DeplacementException e) {
				retourArriere();
				System.out.println("Le déplacement n'est pas valide.");
			} catch (JeuJoueurException e) {
				retourArriere();
				e.printStackTrace();
			}
		}
		estEnEchec(echiquier.getJeuCourant().getCouleur());
	}

	/**
	 * En cas d'erreur, cette méthode remet la pièce selectionné par le joueur sur sa case d'origine.
	 */
	private void retourArriere(){
		if(chessPiece != null){
			JPanelCase jpc2 = (JPanelCase) chessBoard.findComponentAt(parentLocation);
			jpc2.add(chessPiece);
			chessPiece.setVisible(true);
			chessPiece = null;
		}
	}

	/**
	 * NON FONCTIONNEL
	 * @param coul
	 * @return
	 */
	private void estEnEchec(Couleur coul){
		if(echiquier.getEtatRoi(coul) == EtatRoi.EchecEtMat){
			javax.swing.JOptionPane.showMessageDialog(null,"Le Roi "+echiquier.getJeuCourant().getCouleur()+" est en Echec et MAT !\n Joueur "+echiquier.getJeuAdverse().getCouleur()+" vous avez gagné !");
		}else if(echiquier.getEtatRoi(coul) == EtatRoi.Echec){
			javax.swing.JOptionPane.showMessageDialog(null,"Le Roi "+echiquier.getJeuCourant().getCouleur()+" est en Echec.");
		}else if(echiquier.getEtatRoi(coul) == EtatRoi.Pat){
			javax.swing.JOptionPane.showMessageDialog(null,"Pat ! Egalité !");
		}
	}

	/**
	 * Gestion de la mutation d'un pion. Appel une JFramePromotion pour proposer au joueur le type de pièce dans lequel il veut promouvoir son Pion.
	 * @param cp
	 */
	private void promotion(JLabelPiece cp){
		if(cp != null){
			if(cp.getPiece() != null && cp.getPiece().getType() == PieceType.Pion && ((Pion)cp.getPiece()).doitMuter()){
				System.out.println("HERE BOY !!");
				JFramePromotion jfp = new JFramePromotion(echiquier.getJeuAdverse().getCouleur(), (Pion)cp.getPiece(), this, cp);
			}else{
				return;
			}
		}else{
			return;
		}
	}

	/**
	 * Change l'icone du pion qui viens d'être promu.
	 * @param piece La pièce qui est la promotion du pion.
	 */
	public void repeindrePiecePromu(Piece piece,JLabelPiece chessP){
		if(chessP != null){
			File f=new File("");
			String rp = f.getAbsolutePath()+"/src/graphique/icon_piece";
			rp = f.getAbsolutePath()+"/src/graphique/icon_piece";
			rp = rp+"/"+piece.getCouleur().toString()+"/"+piece.getType().toString()+".png";

			chessP.setVisible(false);
			chessP.setPiece(piece);
			chessP.setIcon(new ImageIcon(rp));
			chessP.setVisible(true);

			chessP = null;
		}



	}

}